package br.com.vilababy.sigvb.repository;

import java.util.ArrayList;
import java.util.List;

import br.com.vilababy.sigvb.constantes.RelacaoEnum;
import br.com.vilababy.sigvb.dao.AlunoDAO;
import br.com.vilababy.sigvb.dao.SIGVBDAOFactory;
import br.com.vilababy.sigvb.mb.aluno.ResponsavelMBean;
import br.com.vilababy.sigvb.modelo.Aluno;
import br.com.vilababy.sigvb.modelo.Responsavel;

public class AlunoRepository extends AbstractSIGVBRepository<Aluno> {
	
	/**
	 * @author Diego Patrick da Silva Santos
	 */
	public AlunoRepository() {
		super(SIGVBDAOFactory.getInstancia().getAlunoDAO());
	}

	@Override
	public Aluno inserir(Aluno aluno) {
		aluno.setId(getDao().cadastrar(aluno).getId());
		return aluno;
	}
	
	public Aluno inserir(Aluno aluno, Responsavel pai, Responsavel mae) {
		aluno = adicionarPaisAluno(aluno, pai, mae);
		aluno.setId(getDao().cadastrar(aluno).getId());
		inserirAlunoPais(aluno);
		return aluno;
	}
	
	private List<Responsavel> criarPaiMaeRelacao(Responsavel pai, Responsavel mae) {
		pai.setRelacao(RelacaoEnum.PAI);
		mae.setRelacao(RelacaoEnum.MAE);
		List<Responsavel> pais = new ArrayList<Responsavel>();
		pais.add(pai);
		pais.add(mae);
		return pais;
	}
	
	private Aluno adicionarPaisAluno(Aluno aluno, Responsavel pai, Responsavel mae) {
		List<Responsavel> pais = criarPaiMaeRelacao(pai, mae);
		
		ResponsavelMBean responsavelBean = new ResponsavelMBean();
		Responsavel paiNovo =  ((ResponsavelRepository) responsavelBean.getRepositoryResponsavel()).consultar(pais.get(0));
		Responsavel maeNova = ((ResponsavelRepository) responsavelBean.getRepositoryResponsavel()) .consultar(pais.get(1));
		
		if (paiNovo.getId() != null)
			pais.set(0, paiNovo);
		
		if (maeNova.getId() != null)
			pais.set(1, maeNova);
		
		aluno.setResponsaveis(pais);
		return aluno;
	}
	
	@Override
	public boolean atualizar(Aluno aluno) throws Exception {
		try {
			getDao().alterar(aluno);
			return true;
		} catch (Exception ex) {
			throw new Exception(ex);
		}
	}

	@Override
	public boolean remover(Aluno aluno) {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Aluno consultar (Aluno aluno) {
		return null;
	}

	@Override
	public List<Aluno> listar(Aluno aluno, int primeiroRegistro, int totalRegistros) {
		if (aluno != null && ((aluno.getNome() != null && !aluno.getNome().isEmpty()) || (aluno.getApelido() != null && !aluno.getApelido().isEmpty())))
			return ((AlunoDAO)getDao()).listar(aluno, primeiroRegistro, totalRegistros);
		return listarParcial(primeiroRegistro, totalRegistros);
	}
	
	public List<Aluno> listarParcial(int primeiroRegistro, int totalRegistros) {
		return ((AlunoDAO)getDao()).listarPaginacao(primeiroRegistro, totalRegistros);
	}
	
	public int totalAlunosFiltrados() {
		return ((AlunoDAO) getDao()).getQuantidadeFiltrados();
	}
	
	public int totalAlunosComResposavel() {
		return ((AlunoDAO) getDao()).getQuantidadeAlunoComResponsavel();
	}
	
	public int totalAlunosConsultados(Aluno aluno) {
		return ((AlunoDAO) getDao()).getQuantidadeConsultados(aluno);
	}
	
	public int totalAlunosConsultadosPaisNome(Aluno aluno, Responsavel pai, Responsavel mae) {
		List<Responsavel> pais = criarPaiMaeRelacao(pai, mae);
		return ((AlunoDAO) getDao()).getQuantidadeConsultadosAlunoPaisNome(aluno, pais.get(0), pais.get(1));
	}
	
	public int totalUsuariosCameraFiltrados() {
		return ((AlunoDAO) getDao()).getQuantidadeUsuariosCameraFiltrados();
	}
	
	private void inserirAlunoPais(Aluno aluno) {
		ISIGVBRepository<Responsavel> repository = new ResponsavelRepository();
		List<Responsavel> responsaveis = new ArrayList<Responsavel>();
		for (Responsavel responsavel : aluno.getResponsaveis()) {
			responsavel.setAluno(aluno);
			repository.inserir(responsavel);
			responsaveis.add(responsavel);
		}
		aluno.setResponsaveis(responsaveis);
	}

	@Override
	public Aluno get(Long id) {
		return getDao().get(id, Aluno.class);
	}
	
	public List<Aluno> consultarAlunosUsuario(int primeiroRegistro, int totalRegistros) {
		return ((AlunoDAO)getDao()).listarAlunosPossuemUsuario(primeiroRegistro, totalRegistros);
	}
	
	public List<Aluno> consultarAlunoSemUsuario() {
		return ((AlunoDAO)getDao()).listarAlunosNaoPossuemUsuario();
	}
	
	public List<Aluno> listarParcialAlunoPaisNome(Aluno aluno, Responsavel pai, Responsavel mae, int primeiroRegistro, int totalRegistros) {
		List<Responsavel> pais = criarPaiMaeRelacao(pai, mae);
		return ((AlunoDAO)getDao()).listarParcialAlunoPaisNome(aluno, pais.get(0), pais.get(1), primeiroRegistro, totalRegistros);
	}
	
	public List<Aluno> listarAlunoPaisNome(Aluno aluno, Responsavel pai, Responsavel mae) {
		List<Responsavel> pais = criarPaiMaeRelacao(pai, mae);
		return ((AlunoDAO)getDao()).listarAlunoPaisNome(aluno, pais.get(0), pais.get(1));
	}

	@Override
	public List<Aluno> listarTodos() {
		return ((AlunoDAO)getDao()).listar();
	}
}
